#define xuser mixc::powerful_cat
#include"io/tty.hpp"
#include"lang/cxx/format.hpp"
#include"lang/cxx/logger_helper.hpp"
#include"lang/cxx.hpp"
#include"mixc.hpp"
#include"utils/counter.hpp"
#include"utils/static_length_of.hpp"

// 两种分配方案
#define xuse_temp_allocator 0

xinit(xuser::the_main){
    using namespace xuser;

#if xuse_temp_allocator
    // temp_allocator 是个分配的内存是临时内存，出了作用域就释放了，c08 指向的内容将无效
    temp_allocator memory;
    auto alloc      = memory.item_as<char>();
#else
    // 注意：
    // 每次返回的地址是一样的，所以是新值覆盖旧值的逻辑
    // 这种方式使用有一些限制，但性能好一些
    char buf[128];
    auto alloc = [&](uxx length) -> char * { // 需要指定缓冲区类型
        if (length > static_length_of(buf)){ // 检查缓冲区大小是一个好习惯
            // 返回 null 并不会导致异常，只是会终止分配后续的操作，如果没有特殊要求，则会生成空串
            return nullptr;
        }
        return buf;
    };
#endif
    counter demo = 0;

    // 演示：格式化输出
    {
        xhint(demo);

        uxx year = 2024;
        uxx month = 11;
        uxx day = 9;
        char flag = '#';
        f64 half = 0.5;

        // 变长参数，最后一个参数串 alloc
        // 参数用逗号隔开，最后生成如下格式化字符串
        // year:2024 month:11 day:9 flag:# half:0.5
        xhint(c08("year, month, day, flag, half,").logger_helper(year, month, day, flag, half, alloc));

        // 下面效果是类似的，只不过不需要手动写 "year, month, day, flag," 这个字符串了
        // logger_helper 只是一个辅助函数
        tty.xreflect_line(year, month, day, flag, half);
    }

    // 演示：格式化输出，占位符模式
    {
        xhint(demo);

        uxx hex = 0x1024;

        // 打印:
        // dec:4132 hex:1234
        xhint(c08("dec, hex,").logger_helper(hex, place_holder::H{hex}, alloc));

        // 如果觉得命名空间过于冗长，就使用如下语句导出命名空间，这样就可以省略 place_holder:: 前缀
        using namespace place_holder;

        xhint(c08("hex, e,").logger_helper(H{hex}, e{3.125}, alloc));

        // 这里只是一笔带过，占位符模板类的更多例子可以参考 format.cpp
    }
};
